import os
from moviepy.editor import *
import cv2


def getMusic(video_name):
    """
    获取指定视频的音频
    :param video_name: 视频名称
    :return: 音频对象
    """
    # 读取视频文件
    video = VideoFileClip(video_name)
    # 返回音频
    return video.audio


def addMusic(input_video_path, audio, output_video_path, volumex):
    """实现混流，给video_name添加音频"""
    # 读取视频
    video = VideoFileClip(input_video_path)
    # 设置视频的音频
    video = video.set_audio(audio)
    # 音量增强
    video = video.volumex(volumex)
    # 调整视频码率

    # 保存新的视频文件
    video.write_videofile(output_video_path)


# def deleteTransitionalFiles:
#     """删除过渡文件"""
#     frames = [frame_path + i for i in os.listdir(frame_path)]
#     humansegs = [humanseg_path + i for i in os.listdir(humanseg_path)]
#     for frame in frames:
#     os.remove(frame)
#     for humanseg in humansegs:
#     os.remove(humanseg)

def get_fps_from_video(video_path):
    '''
    获取视频fps
    :return:


    另外，cv2.VideoCapture(0)是打开本地摄像头

    以下是opencv-python可以获取视频的相关信息，可以通过从0开始的序号获取
    CV_CAP_PROP_POS_MSEC 视频文件的当前位置（以毫秒为单位）或视频捕获时间戳。
    CV_CAP_PROP_POS_FRAMES 接下来要解码/捕获的帧的基于0的索引。
    CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置：0 - 电影的开始，1 - 电影的结尾。
    CV_CAP_PROP_FRAME_WIDTH 视频流中帧的宽度。
    CV_CAP_PROP_FRAME_HEIGHT 视频流中帧的高度。
    CV_CAP_PROP_FPS 帧速率。
    CV_CAP_PROP_FOURCC 编解码器的4字符代码。
    CV_CAP_PROP_FRAME_COUNT 视频文件中的帧数。
    CV_CAP_PROP_FORMAT 返回的Mat对象的格式 retrieve() 。
    CV_CAP_PROP_MODE 指示当前捕获模式的特定于后端的值。
    CV_CAP_PROP_BRIGHTNESS 图像的亮度（仅适用于相机）。
    CV_CAP_PROP_CONTRAST 图像对比度（仅适用于相机）。
    CV_CAP_PROP_SATURATION 图像的饱和度（仅适用于相机）。
    CV_CAP_PROP_HUE 图像的色调（仅适用于相机）。
    CV_CAP_PROP_GAIN 图像的增益（仅适用于相机）。
    CV_CAP_PROP_EXPOSURE 曝光（仅适用于相机）。
    CV_CAP_PROP_CONVERT_RGB 布尔标志，指示是否应将图像转换为RGB。
    CV_CAP_PROP_WHITE_BALANCE_U 白平衡设置的U值（注意：目前仅支持DC1394 v 2.x后端）
    CV_CAP_PROP_WHITE_BALANCE_V 白平衡设置的V值（注意：目前仅支持DC1394 v 2.x后端）
    CV_CAP_PROP_RECTIFICATION 立体摄像机的整流标志（注意：目前仅支持DC1394 v 2.x后端）
    CV_CAP_PROP_ISO_SPEED摄像机 的ISO速度（注意：目前仅支持DC1394 v 2.x后端）
    CV_CAP_PROP_BUFFERSIZE 存储在内部缓冲存储器中的帧数（注意：目前仅支持DC1394 v 2.x后端）
    '''
    cap = cv2.VideoCapture(video_path)

    # get方法参数按顺序对应下表（从0开始编号，比如这里为了获取视频的总帧数，在下表是排第八个的 CV_CAP_PROP_FRAME_COUNT
    fps = cap.get(5)
    print(fps)
    return fps


def get_size_from_video(video_path):
    '''
    获取视频size
    :return:
    '''
    cap = cv2.VideoCapture(video_path)

    # get方法参数按顺序对应下表（从0开始编号，比如这里为了获取视频的总帧数，在下表是排第八个的 CV_CAP_PROP_FRAME_COUNT
    width = int(cap.get(3))
    height = int(cap.get(4))
    print((width, height))
    return (width, height)


def clip_video(input_video_path, output_video_path, t_start, t_end):
    '''
    视频剪辑
    :param input_video_path:
    :param output_video_path:
    :param t_start:
    :param t_end:
    :return:
    '''
    video = VideoFileClip(input_video_path).subclip(t_start=t_start, t_end=t_end)
    video.write_videofile(output_video_path)